import axios from "axios";


// 用来判断是否为开发环境
// 开发环境             生产环境                   测试环境
// development         production                  production
// npm start           npm run build               npm run test
const isDev = process.env.NODE_ENV === 'development'

const request =axios.create({
    // http://10.31.155.245:3000/admin
    //  baseURL: isDev ? '开发环境(后端程序员电脑的ip)' : '生产环境(云服务器的ip地址或者域名)',
    baseURL: isDev ? 'http://10.31.155.245:3000/admin' : 'http://121.89.205.189:3000/admin',
    // 老师的
    // baseURL:'http://10.31.155.164:3333/admin',
    // 服务器的
    // baseURL:'http://121.89.205.189:3000/admin',
    // 配置请求超时时间
    timeout: 60000
})

// 请求拦截器
request.interceptors.request.use( (config)=>{
    // 发送数据请求前要做的事情
    // 配置 token
    const userInfo = JSON.parse(localStorage.getItem('userInfo') == 'undefined' ? '{}' : localStorage.getItem('userInfo'))  

    if (userInfo) { 
        config.headers.token = userInfo.token
    }
    return config
})

// 响应拦截器
request.interceptors.response.use( (response)=>{
    // 接收数据请求后要做的事情

    // token 会在长时间不使用的情况下失效，失败后需要重新登录
    // 重新进入登录页面
    if(response.data.code == '10119'){
        console.log('token已过期');
        // 清空用户所有数据
        localStorage.clear()
        
        // 跳转到登录页面
        window.location.href = '/#/login'
        
    }
    return response.data
})


// 封装数据请求的方法
export default function ajax(config){

    //  获取请求的必要参数
    // url 请求地址  method 请求方式  data 请求参数  headers 请求头
    const { url ='' , method = 'get' ,data = {}, headers = {} } = config

    switch(method.toUpperCase()){
        case 'GET':
            // get请求配置
            return request.get(url,{params:data})


        case 'POST':
            // post请求配置

            // 表单数据需要序列化一次数据
            if(headers['content-type'] == 'application/x-www-form-urlencoded'){
                // 将 json 数据进行序列化一下，格式化一次
                const obj = new URLSearchParams()
                for(const key in data){
                    obj.append(key,data[key])
                }
                return request.post(url,obj,{headers})
            }


            // 文件数据需要序列化一次数据
            if(headers['content-type'] == 'multipart/form-data'){
                // 将 json 数据进行序列化一下，格式化一次
                const obj = new FormData()
                for(let key in data){
                    obj.append(key,data[key])
                }
                return request.post(url,obj,{headers})
            }

            // 普通的 json 数据
            return request.post(url,data)


        case 'DELETE':
            // delete 请求配置
            return request.delete(url,{ data: data })

        case 'PUT':
            // put 请求配置
            return request.put(url,data)

        default:
            // 前面的匹配都不成立的时候，就交给axios 自己处理
           return request.request(config)
    }
}